package com.yigerende.service.impl;


import com.yigerende.NotFoundException;
import com.yigerende.dao.TagRepository;
import com.yigerende.model.Tag;
import com.yigerende.model.Type;
import com.yigerende.service.TagService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
public class TagServiceImpl implements TagService {

    @Autowired
    private TagRepository tagRepository;

    //新增分类(传递用户输入的分类，从数据库查询到返回分类)
    @Transactional
    @Override
    public Tag saveTag(Tag tag) {
        return tagRepository.save(tag);
    }

    //显示查询分类(通过id查询分类)
    @Transactional
    @Override
    public Tag getTag(Long id) {
        return tagRepository.findById(id).get();
    }


    //查询用户输入的名字是否存在数据库里面
    @Override
    public Tag getTagByName(String name) {
        return tagRepository.findByName(name);
    }

    //分页查询
    @Transactional
    @Override
    public Page<Tag> listTag(Pageable pageable) {
        return (Page<Tag>) tagRepository.findAll(pageable);
    }

    //修改分类名称(通过id修改分类)
    @Transactional
    @Override
    public Tag updateTag(Long id, Tag tag) {
        //通过id查询到数据，进行判断
        Tag t = tagRepository.findById(id).get();
        //判断要修改的分类不在的话
        if(t == null){
            throw new NotFoundException("不存在该类型");//自定义异常显示
        }
        //用BeanUtils来把数据库查到的t数据赋值给type模型
        BeanUtils.copyProperties(tag,t);

        //直接把Type模型使用增加的方法save修改，因为t里面有id，所以是修改
        return tagRepository.save(t);
    }


    //删除分类(通过id来删除分类)
    @Transactional
    @Override
    public void deleteTag(Long id) {
        tagRepository.deleteById(id);
    }

    //查询到全部数据
    @Override
    public List<Tag> listTag() {
        return tagRepository.findAll();
    }




    //通过博客的标签id传递查询标签对象模型
    @Override
    public List<Tag> listTag(String ids) {//从数据库查询出来的标签id是字符串以逗号分隔，传递到方法里面变成集合
        return tagRepository.findAllById(convertToList(ids));
    }



    //因为标签有多个，数据库的标签类型是字符串类型，将字符串变成集合，通过","分隔放到集合里面
    private List<Long> convertToList(String ids){
        List<Long> list = new ArrayList<>();
        if(!"".equals(ids) && ids != null){
            String[] idarray = ids.split(",");//以逗号分隔
            for (int i=0; i<idarray.length;i++){
                list.add(new Long(idarray[i]));
            }
        }
        return list;
    }



    /*上面是管理页面的，下面是用户显示页*/

    @Override
    public List<Tag> listTagTop(Integer size) {
        /**
         * 这里是实现查询排序所以要这样写
         * 现在的版本这两个方法直接调用即可，不要创建对象
         * */
        //根据博客数量进行倒序排列
        Sort sort = Sort.by(Sort.Direction.DESC,"blogs.size");
        //创建分页对象，给第一页，size一页显示多少条分类，sort根据上面排序
        Pageable pageable = PageRequest.of(0,size,sort);
        return tagRepository.findTop(pageable);
    }
}
